home *** CD-ROM | disk | FTP | other *** search
/ Programmer Power Tools / Programmer Power Tools.iso / progjrn / pj_7_2.arc / SHARE.CXX < prev    next >
C/C++ Source or Header  |  1988-12-22  |  2KB  |  99 lines

  1. // share.cxx
  2. //
  3. // tests the Task and Semaphore classes
  4. //
  5. // author: vaughn vernon
  6. // (c) Copyright 1988 Aspen Scientific
  7. // All Rights Reserved.
  8.  
  9. #include <stream.hxx>
  10. #include <os2class/task.hxx>
  11. #include <os2class/semaphor.hxx>
  12.  
  13. // the routine executed as a Task
  14. VOID FAR aRoutine( VOID );
  15.  
  16. // the resource to protect
  17. CHAR aBuffer[ 36 ];
  18.  
  19. // global RAM semaphore objects
  20. Semaphore bufSem;
  21. Semaphore startingGun;
  22.  
  23. int
  24. main()
  25. {
  26.     // get ready for the race;
  27.     // self set signalling semaphore
  28.     ++startingGun;
  29.  
  30.     // create a global global ostream semaphore
  31.     Semaphore streamSem( "\\sem\\ostream.cls", 1, 1 );
  32.  
  33.     // spawn a task; os/2 thread
  34.     Task loop( aRoutine, 4096 );
  35.  
  36.     if ( loop.GetStatus() == FALSE ) {
  37.  
  38.         cerr << "\nError: the task was not run!\n";
  39.         DosExit( EXIT_PROCESS, 2 );
  40.     }
  41.  
  42.     // wait on the task to begin
  43.     startingGun.Wait( -1L );
  44.  
  45.     for ( int i=0; i < sizeof (aBuffer); ++i) {
  46.  
  47.         bufSem.SetRequest( -1L );
  48.         aBuffer[i] = 'A' + i;
  49.         bufSem.Clear();
  50.         DosSleep(0L);
  51.     }
  52.  
  53.     bufSem.SetRequest( -1L );
  54.     aBuffer[ sizeof( aBuffer ) - 1 ] = char(0);
  55.     streamSem.SetRequest( -1L );
  56.     cout << "\nMain thread finished, buffer is:\n" << aBuffer << "\n";
  57.     cout.flush();
  58.     streamSem.Clear();
  59.     bufSem.Clear();
  60.  
  61.     // wait on thread to finish
  62.     startingGun.Wait( -1L );
  63.  
  64.     DosExit( EXIT_THREAD, 0 );
  65. }
  66.  
  67. // the task/thread routine
  68. VOID FAR
  69. aRoutine()
  70. {
  71.     // for sharing ostream
  72.     Semaphore streamSem( "\\sem\\ostream.cls", 1, 0 );
  73.  
  74.     // fire the startingGun for this and main thread
  75.     --startingGun;
  76.     ++startingGun;
  77.  
  78.     for ( int i=0; i < sizeof (aBuffer); ++i ) {
  79.  
  80.         bufSem.SetRequest( -1 );
  81.         aBuffer[i] = 'a' + i;
  82.         bufSem.Clear();
  83.         DosSleep(0L);
  84.     }
  85.  
  86.     bufSem.SetRequest( -1L );
  87.     aBuffer[ sizeof( aBuffer ) - 1 ] = char(0);
  88.     streamSem.SetRequest( -1L );
  89.     cout << "\nSecondary thread finished, buffer is:\n" << aBuffer << "\n";
  90.     cout.flush();
  91.     streamSem.Clear();
  92.     bufSem.Clear();
  93.  
  94.     // i'm finished!
  95.     --startingGun;
  96.  
  97.     DosExit( EXIT_THREAD, 0 );
  98. }
  99.